#ifndef ES_SPI_H_
#define ES_SPI_H_


#include "stm_std_lib.h"



//CSPI模式
//主机模式
#define CSPI_MASTER 0x0

//从机模式
#define CSPI_SLAVE 0x1

//SPI无意义信号
#define CSPI_NOP 0xff


#define NOP         0xFF 




//SPI中断响应函数指针定义
typedef void(*spi_it_handler)(u8 val);










/*
SPI类
使用SPI1

IO:
PA4-NSS
PA5-SCK
PA6-MISO
PA7-MOSI

*/
class CSPI {

public:

	vu16 SPI_CPOL;		//时钟极性
	vu16 SPI_CPHA;		//时钟相位
	vu16 SPI_NSS;			//NSS模式
	vu16 SPI_BaudRatePrescaler;		//速率	
	vu16 SPI_FirstBit;		//高位设置
	vu16 SPI_CRCPolynomial;			//效验
	vu16 SPI_DataSize;		//数据长度



	  //构造函数
	  //spiMode:CSPI_MASTER或 CSPI_SLAVE		主从模式
	CSPI(u8 spiMode);


	//初始化SPI
	void Init();




	//设置接收中断观察者,此函数应在Init之后调用
	void SetItListener(spi_it_handler handler);


	

	//拉高NSS(默认PA4)
	void NSS_High();



	//拉低NSS(默认PA4)
	void NSS_Low();




	//发送
	void Send(u8 byte);


	//接收
	u8 Recv();



	//读写一个字节，等待超时返回0
	uint8_t ReadWriteByte(uint8_t TxData);		


	//发送一个字节，并接收一个字节
	 u8 WriteRead(u8 byte);

	u8 WriteReg(u8 reg, u8 data);

	u8 ReadReg(u8 reg);

	u8 WriteBuf(u8 reg, u8* buff, u8 len);

	u8 ReadBuf(u8 reg, u8* buff, u8 len);

	//发送缓存中的数据，并接收(接收缓存必需与发送缓存一样长度)
	void WriteRead(u8* sendBuf, u8* recvBuf, int len);






private:
	u8 m_spiMode;


	void RCC_Config();


	void GPIO_Config();

	
	void NVIC_Config();


	void SPI_Config();


};


#endif
